# 封装数据库操作类
import pymysql


class Db:
    def __init__(self, host, user, password, charset, db):
        self.host = host
        self.user = user
        self.password = password
        self.charset = charset
        self.db = db
        # 1.连接数据库
        self.con = pymysql.connect(
            host=self.host,  # 参数host     连接数据库主机IP地址
            user=self.user,  # 参数user     连接数据库用户名称
            password=self.password,  # 参数password 连接数据库用户密码
            database=self.db,  # 参数database 连接数据库名称
            # port=self.port  # 参数port     连接数据库使用端口
        )
        # 2.创建游标对象 执行sql语句
        self.cursor = self.con.cursor()

        # 类属性：内部或者固定属性
        # 类方法：增，删，改，查
        # 定义类方法，执行查询数据库操作

    def select(self, sql):
        # 查
        # 3.执行sql语句 接收结果
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        results = self.cursor.fetchall()
        return results

    def others(self, sql):
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        self.con.commit()

    def select_alone(self, sql):
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        result = self.cursor.fetchone()
        return result

    def select_many(self, sql, data):
        # 查
        # 3.执行sql语句 接收结果
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        result = self.cursor.fetchone()
        return result

    def insert(self, sql):
        # 增
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        self.con.commit()

    def insert_many(self, sql, data):
        # 增
        self.con.ping(reconnect=True)
        self.cursor.execute(sql, data)
        self.con.commit()

    def delete(self, sql):
        # 删除
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        self.con.commit()

    def delete_many(self, sql, data):
        # 删除
        self.con.ping(reconnect=True)
        self.cursor.execute(sql, data)
        self.con.commit()

    def update(self, sql):
        # 改
        self.con.ping(reconnect=True)
        self.cursor.execute(sql)
        self.con.commit()

    def update_many(self, sql, data):
        # 改
        self.con.ping(reconnect=True)
        self.cursor.execute(sql, data)
        self.con.commit()

    # 4.关闭连接函数
    def close(self):
        self.con.close()

    # #类实例化
    # db = Db("localhost", 3306, "root", "123456", "student")
    # ##调用 db.py 自定义模块中封装DB类实例化对象db
